home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 076-100 / disk_096 / animplayer / display_aud.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  8KB  |  300 lines

  1. /**********************************************************
  2.  *
  3.  *   NAME
  4.  *      Display_Aud -- animates a prerendered vignette
  5.  *
  6.  *   SYNOPSIS
  7.  *      Display_Aud();
  8.  *
  9.  *   DESCRIPTION
  10.  *      This function systematically displays a prerendered vignette.
  11.  *
  12.  *      copyright (c) 1987 Martin D. Hash
  13.  *
  14.  *   LAST EDITED
  15.  *      Martin Hash                        23 Aug 1987
  16.  *
  17.  *   EDIT HISTORY
  18.  *      21 Mar 1987  MH  Created.
  19.  *     5 Jul         Signals for interrupts.
  20.  *      12 Jul         Switch copyright.
  21.  *      16 Aug         ANIM standard.
  22.  *
  23.  **********************************************************/
  24.  
  25. #include <exec/types.h>
  26. #include <exec/nodes.h>
  27. #include <exec/interrupts.h>
  28. #include <hardware/intbits.h>
  29. #include <intuition/intuition.h>
  30. #include <graphics/gfxbase.h>
  31. #include "df1:FileCons.h"
  32. #include "df1:KeyCons.h"
  33. #include "df1:ANIMCons.h"
  34.  
  35. /* LOCAL CONSTANTS */
  36.  
  37. #define UP            1
  38. #define STEADY            0
  39. #define DOWN            -1
  40.  
  41. /* EXTERNAL VARIABLES */
  42.  
  43. extern struct Window *window;
  44. extern struct View view1, view2;
  45. extern struct ViewPort viewport1, viewport2;
  46. extern struct RastPort rastport1, rastport2;
  47. extern struct BitMap bitmap1, bitmap2;
  48. extern struct IntuiText framenumbertext;
  49. extern char numbertext[];
  50. extern ULONG *size;
  51. extern struct Interrupt *VertBIntr;
  52. extern FrameNode *patriarch;
  53.  
  54. /* EXTERNAL FUNCTIONS */
  55.  
  56. void Copyright(),
  57.      LoadIFF(),
  58.      Timer();
  59. int XORDLTAshort(),
  60.     Call_Pack();
  61. struct Task *FindTask();
  62.  
  63. /* GLOBAL VARIABLES */
  64.  
  65. struct Task *task;
  66. int mask, signal;
  67.  
  68. /* FILE VARIABLES */
  69.  
  70. static char blanktext[] = "           ";
  71. static struct IntuiText blank = {
  72.   1, 0, JAM2,
  73.   0, 0, NULL,
  74.   blanktext,
  75.   NULL
  76. };
  77.  
  78. /* FUNCTION */
  79.  
  80. void Display_Aud()
  81. {
  82.    /* LOCAL VARIABLES */
  83.  
  84.    struct View *view;
  85.    struct ViewPort *viewport;
  86.    struct IntuiMessage *message;
  87.    ULONG class;
  88.    UWORD code,
  89.          frame_rate = 5;
  90.    BYTE up_or_down = UP;
  91.    int frame = 3,
  92.        counter = 1;
  93.    struct BitMap *bitmap;
  94.    struct RastPort *rastport;
  95.    BOOL odd_frame = TRUE,
  96.     display_frame_number = FALSE,
  97.         looping = TRUE,
  98.     next = FALSE,
  99.     stop = FALSE;
  100.    WORD direction = STEADY;
  101.    FrameNode *prevframenode, *framenode;
  102.  
  103.    /* CODE */
  104.  
  105.    task = FindTask( NULL );
  106.    if ((signal = AllocSignal( -1 )) == -1)
  107.       return;
  108.    mask = 1<<signal;
  109.    SetSignal( 0, mask );
  110.  
  111.    Timer();
  112.    window->Flags |= RMBTRAP;
  113.  
  114.    if (patriarch == NULL | patriarch->next == NULL)
  115.       return;
  116.    else
  117.       framenode = patriarch->next;
  118.  
  119.    frame = 2;
  120.    viewport = &viewport2;
  121.    view = &view2;
  122.    rastport = &rastport2;
  123.  
  124.    while (looping) {
  125.       if (1<<window->UserPort->mp_SigBit)
  126.          while (message = (struct IntuiMessage *)GetMsg( window->UserPort)) {
  127.             class = message->Class;
  128.             code = message->Code;
  129.  
  130.             ReplyMsg( message );
  131.             switch (class) {
  132.            case RAWKEY:
  133.               switch (code) {
  134.                  case RETURN:
  135.             if (display_frame_number) {
  136.                    display_frame_number = FALSE;
  137.                strcpy( numbertext, "   " );
  138.                        PrintIText( &rastport1, &framenumbertext, 310, 30 );
  139.                        PrintIText( &rastport2, &framenumbertext, 310, 30 );
  140.                PrintIText( &rastport1, &blank, 300, 221 );
  141.                PrintIText( &rastport2, &blank, 300, 221 );
  142.                 }
  143.                 else {
  144.                display_frame_number = TRUE;
  145.                        stci_d( numbertext, frame, 5 );
  146.                        strncat( numbertext, "   ", 4 );
  147.                        PrintIText( rastport, &framenumbertext, 310, 30 );
  148.             /**** retain this call  *****/
  149.                Copyright( rastport );
  150.             /****************************/
  151.                 }
  152.             break;
  153.                      case ESC:
  154.                     framenode = patriarch;
  155.             while (framenode != NULL) {
  156.                if (framenode->datasize) 
  157.                   FreeMem((UBYTE *)framenode->data,
  158.                    framenode->datasize);
  159.                        FreeMem((UBYTE *)framenode->cmap,
  160.                 framenode->cmapsize);
  161.                prevframenode = framenode;
  162.                framenode = framenode->next;
  163.                FreeMem((UBYTE *)prevframenode,sizeof(FrameNode));
  164.             }
  165.                     looping = FALSE;
  166.                     break;
  167.              case F1:
  168.                 frame_rate = 1;    /* 60 frames/second */
  169.                 break;
  170.              case F2:
  171.                 frame_rate = 2; /* 30 frames/second */
  172.                 break;
  173.              case F3:
  174.                 frame_rate = 3; /* 20 frames/second */
  175.                 break;
  176.              case F4:
  177.                 frame_rate = 4; /* 15 frames/second */
  178.                 break;
  179.              case F5:
  180.                 frame_rate = 5; /* 12 frames/second */
  181.                 break;
  182.              case F6:
  183.                 frame_rate = 6; /* 10 frames/second */
  184.                 break;
  185.              case F7:
  186.                 frame_rate = 8; /* 8 frames/second */
  187.                 break;
  188.              case F8:
  189.                 frame_rate = 10; /* 6 frames/second */
  190.                 break;
  191.              case F9:
  192.                 frame_rate = 12; /* 5 frames/second */
  193.                 break;
  194.              case F10:
  195.                 frame_rate = 15; /* 4 frames/second */
  196.                 break;
  197.              case SPACE:
  198.                 stop = FALSE;
  199.             break;
  200.              case ARROWBACKWARD:
  201.             if (up_or_down == UP)
  202.                direction = DOWN;
  203.             break;
  204.              case ARROWFORWARD:
  205.                 if (up_or_down == DOWN)
  206.                direction = UP;
  207.                 break;
  208.              case ARROWUP:
  209.             frame_rate += 1;
  210.             break;
  211.              case ARROWDOWN:
  212.                 frame_rate -= 1;
  213.                 if (frame_rate < 1)
  214.                frame_rate = 1;
  215.             break;
  216.                   }
  217.            case MOUSEBUTTONS:
  218.               switch (code) {
  219.              case SELECTDOWN:
  220.                 next = TRUE;
  221.                 stop = TRUE;
  222.             if (up_or_down == DOWN)
  223.                direction = UP;
  224.                 break;
  225.              case MENUDOWN:
  226.             next = TRUE;
  227.             stop = TRUE;
  228.             if (up_or_down == UP)
  229.                direction = DOWN;
  230.                 break;
  231.                   }
  232.               break;
  233.             }
  234.          }
  235.  
  236.          while (counter++ < frame_rate)
  237.         Wait( mask );
  238.  
  239.          LoadView( view );
  240.          counter = 1;
  241.          if ((!stop || next) && looping) {
  242.             if (odd_frame) {
  243.                bitmap = &bitmap1;
  244.            viewport = &viewport1;
  245.            view = &view1;  
  246.            rastport = &rastport1;
  247.            odd_frame = FALSE;
  248.             }
  249.             else {
  250.                bitmap = &bitmap2;
  251.            viewport = &viewport2;
  252.            view = &view2;
  253.            rastport = &rastport2;
  254.                odd_frame = TRUE;
  255.             }
  256.  
  257.             if (framenode->next == NULL || direction == DOWN) {
  258.                up_or_down = DOWN;
  259.            frame += up_or_down;
  260.            framenode = framenode->prev;
  261.            direction = STEADY;
  262.         }
  263.             else if (framenode->prev == NULL || direction == UP) { 
  264.                up_or_down = UP;
  265.            frame += up_or_down;
  266.            framenode = framenode->next;
  267.            direction = STEADY;
  268.             }
  269.             else {
  270.            frame += up_or_down;
  271.            if (up_or_down == DOWN) {
  272.           framenode = framenode->prev;
  273.                   LoadRGB4( viewport, framenode->cmap, COLORS );
  274.           XORDLTAshort( bitmap, framenode->next->next->data );
  275.            }
  276.            else {
  277.           framenode = framenode->next;
  278.                   LoadRGB4( viewport, framenode->cmap, COLORS );
  279.           XORDLTAshort( bitmap, framenode->data );
  280.            }
  281.         }
  282.  
  283.         if (display_frame_number) {
  284.            stci_d( numbertext, frame, MAXNUMBERTEXT );
  285.            strncat( numbertext, "   ", MAXNUMBERTEXT-1 );
  286.            PrintIText( rastport, &framenumbertext, 310, 30 );
  287.         /**** retain this call  ****/
  288.            Copyright( rastport );
  289.         /***************************/
  290.             }
  291.             next = FALSE;
  292.          }
  293.    }
  294.    window->Flags &= (RMBTRAP^0xFFFFFFFF);
  295.  
  296.    FreeSignal( signal );
  297.    RemIntServer( INTB_VERTB, VertBIntr );
  298.    FreeMem( VertBIntr, sizeof(struct Interrupt));
  299. }
  300.